package servlets;

import manejadores.ManejadorRecurso;
import manejadores.ManejadorTipoRecurso;
import manejadores.ManejadorSolicitudReserva;
import manejadores.ManejadorReserva;
import beans2.SolicitudReserva;
import beans2.TipoRecurso;
import beans2.Recurso;
import beans2.Usuario;
import beans2.Reserva;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import iteradores.*;
import dbUtil.*;
import reportes.*;

/**
 *
 * @author Jose Dario Gimenez
 */
public class Servlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //Connection connection = (Connection) request.getSession().getAttribute("ConexionBd");
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Error loading driver: " + cnfe);
        }
        Connection connection = null;
        try {
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/srr", "srr", "srradmin");
        } catch (SQLException e) {
            System.out.println("Error accediendo a la base de datos:" + e);
        }
        IteradorUsuario usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");

        String url = "";
        String str_op = request.getParameter("accion");
        String op = request.getParameter("op");
        
        //Objeto que averigua si el usuario tiene permiso para acceder al servlet.
        PgAbm testPermiso = new PgAbm();
        testPermiso.setCon(connection);

        try {
            usuarioActual.getReset();
            usuarioActual.getNext();

            if (str_op.equalsIgnoreCase("report")) {

//                if (testPermiso.tienePermiso(nombreModulo,
//                        usuarioActual.getNombreusuario(),
//                        str_op.substring(0, 6))) {
//
//                    url = "/report.jsp?modo=REPORT";
//
//                    beans.TipoRecurso tiporecurso = new beans.TipoRecurso();
//                    tiporecurso.setCon(connection);
//                    tiporecurso.getTiposRecursos();
//
//                    IteradorTipoRecurso it = (IteradorTipoRecurso) tiporecurso.getIteratorAll();
//                    request.setAttribute("TiposRecurso", it);
//                    
//                    beans.Recurso recurso = new beans.Recurso();
//                    recurso.setCon(connection);
//                    recurso.getRecursos();
//
//                    IteradorRecurso it2 = (IteradorRecurso) recurso.getIteratorAll();
//                    request.setAttribute("Recursos", it2);
//
//
//                    if (op != null && op.equalsIgnoreCase("GENREPORT")) {
//                        url = generate_report(connection, request, response);
//                    }
//
//                    
//                } else {
//                    url = "sinpermiso.jsp";
//
//                }
                url = generate_report(connection, request, response);

                RequestDispatcher dispatcher = request.getRequestDispatcher(url);
                response.setCharacterEncoding("UTF-8");
                dispatcher.forward(request, response);
            }

            String accion = request.getParameter("accion");
            if (accion.equalsIgnoreCase("solicitudreserva")) {
                ManejadorRecurso manejadorRecurso = new ManejadorRecurso();
                manejadorRecurso.setConnection(connection);
                ManejadorTipoRecurso manejadorTipoRecurso = new ManejadorTipoRecurso();
                manejadorTipoRecurso.setConnection(connection);
                try {
                    manejadorRecurso.setCondition("");
                    manejadorTipoRecurso.setConditionTipoRecurso("");
                } catch (SQLException e) {
                    System.out.println("Error accediendo a la base de datos:" + e);
                }
                request.setAttribute("recurso", manejadorRecurso);
                request.setAttribute("tiporecurso", manejadorTipoRecurso);
                RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/solicitudreserva.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equalsIgnoreCase("enviarSolicitudDeReserva")) {
                int idTipoRecurso = Integer.parseInt(request.getParameter("tipoRecurso"));
                String radio = request.getParameter("radio");
                String ubicacion = request.getParameter("ubicacion");
                String personaRetiro = "";
                if (!ubicacion.equalsIgnoreCase("")) {
                    personaRetiro = request.getParameter("personaRetiro");
                }
                String diaInicio = request.getParameter("diaInicio");
                String mesInicio = request.getParameter("mesInicio");
                String anioInicio = request.getParameter("anioInicio");
                String horaInicio = request.getParameter("horaInicio");
                String minutoInicio = request.getParameter("minutoInicio");
                String diaFin = request.getParameter("diaFin");
                String mesFin = request.getParameter("mesFin");
                String anioFin = request.getParameter("anioFin");
                String horaFin = request.getParameter("horaFin");
                String minutoFin = request.getParameter("minutoFin");
                String observacion = request.getParameter("observacion");
                SolicitudReserva solicitudReserva = new SolicitudReserva();
                TipoRecurso tipoRecurso = new TipoRecurso();
                tipoRecurso.setId(idTipoRecurso);
                solicitudReserva.setTipoRecurso(tipoRecurso);
                solicitudReserva.setUbicacion(ubicacion);
                solicitudReserva.setPersonaRetiro(personaRetiro);
                solicitudReserva.setFechainicio(diaInicio + "/" + mesInicio + "/" + anioInicio);
                solicitudReserva.setHorainicio(horaInicio + ":" + minutoInicio);
                solicitudReserva.setFechafinal(diaFin + "/" + mesFin + "/" + anioFin);
                solicitudReserva.setHorafinal(horaFin + ":" + minutoFin);
                solicitudReserva.setEstado("P");
                int recursoEspecifico = -1;
                if (radio.equalsIgnoreCase("recursoEspecifico")) {
                    recursoEspecifico = Integer.parseInt(request.getParameter("idrecurso"));
                } else {
                    String caracteristicasMinimas = request.getParameter("observacion2");
                    if (observacion.equalsIgnoreCase("")) {
                        observacion = caracteristicasMinimas;
                    } else {
                        observacion = observacion + "\n" + caracteristicasMinimas;
                    }
                }
                solicitudReserva.setObservacion(observacion);
                Recurso recurso = new Recurso();
                recurso.setId(recursoEspecifico);
                solicitudReserva.setRecurso(recurso);
                Usuario usuario = new Usuario();
                try {
                    usuario.setId(Integer.parseInt(usuarioActual.getIdUsuario()));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                solicitudReserva.setUsuario(usuario);
                ManejadorSolicitudReserva manejadorSolicitudReserva = new ManejadorSolicitudReserva();
                manejadorSolicitudReserva.setConnection(connection);
                manejadorSolicitudReserva.setSolicitudReserva(solicitudReserva);

                try {
                    manejadorSolicitudReserva.store();
                } catch (SQLException e) {
                    System.out.println("Error accediendo a la base de datos:" + e);
                }
                request.setAttribute("msg","Se ha registrado la solicitud de reserva exitosamente, aguarde mientras un operador con privilegios apruebe esta solicitud");
                RequestDispatcher dispatcher = request.getRequestDispatcher("/admin");
                dispatcher.forward(request, response);
            } else if (accion.equalsIgnoreCase("versolicitudreserva")) {
                int index = Integer.parseInt(request.getParameter("index"));
                ManejadorSolicitudReserva manejadorSolicitudReserva = (ManejadorSolicitudReserva) request.getSession().getAttribute("solicitudreserva");
                manejadorSolicitudReserva.setIndex(index);
                int id = manejadorSolicitudReserva.getSolicitudReserva().getRecurso().getId();
                if (id == 0) {
                    ManejadorRecurso manejadorRecurso = new ManejadorRecurso();
                    manejadorRecurso.setConnection(connection);
                    try {
                        manejadorRecurso.setCondition("idtiporecurso=" + manejadorSolicitudReserva.getSolicitudReserva().getTipoRecurso().getId());
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    request.setAttribute("recurso", manejadorRecurso);
                }
                RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/versolicitudreserva.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equalsIgnoreCase("rechazarsolicitudreserva")) {
                ManejadorSolicitudReserva manejadorSolicitudReserva = (ManejadorSolicitudReserva) request.getSession().getAttribute("solicitudreserva");
                try {
                    manejadorSolicitudReserva.rechazar();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                request.setAttribute("msg" , "Se ha rechazado con exito la solicitud de Reserva");
                RequestDispatcher dispatcher = request.getRequestDispatcher("/admin");
                dispatcher.forward(request, response);
            } else if (accion.equalsIgnoreCase("aprobarsolicitudreserva")) {
                ManejadorSolicitudReserva manejadorSolicitudReserva = (ManejadorSolicitudReserva) request.getSession().getAttribute("solicitudreserva");
                
                int id;
                if (manejadorSolicitudReserva.getSolicitudReserva().getRecurso().getId() == 0) {
                    id = Integer.parseInt(request.getParameter("recurso"));
                } else {
                    id = manejadorSolicitudReserva.getSolicitudReserva().getRecurso().getId();
                }
                boolean aprobado=false;
                try {
                    aprobado=manejadorSolicitudReserva.aprobar(id, Integer.parseInt(usuarioActual.getIdUsuario()));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                request.setCharacterEncoding("windows-1252");
                if(aprobado)
                {
                    request.setAttribute("msg" , "La aprobación de la solicitud de reserva se ha realizado con exito");
                }
                else
                {
                    request.setAttribute("msg","La aprobación de la solicitud de reserva no se ha podido realizar debido ha conflictos con otras reservas ya aprobadas en las que se usa el mismo recurso elegido dentro del mismo lapso de tiempo");
                }
                RequestDispatcher dispatcher = request.getRequestDispatcher("/admin");
                dispatcher.forward(request, response);
            } else if (accion.equalsIgnoreCase("listarsolicitudesreservas")) {
                ManejadorSolicitudReserva manejadorSolicitudReserva = new ManejadorSolicitudReserva();
                manejadorSolicitudReserva.setConnection(connection);
                try {
                    manejadorSolicitudReserva.setCondition("");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                request.getSession().setAttribute("solicitudreserva", manejadorSolicitudReserva);
                RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/listasolicitudesreservas.jsp");
                dispatcher.forward(request, response);
            }
            else if(accion.equalsIgnoreCase("listarReservas"))
            {
                ManejadorReserva manejadorReserva=new ManejadorReserva();
                manejadorReserva.setConnection(connection);
                manejadorReserva.setCondition("");
                request.getSession().setAttribute("reserva", manejadorReserva);
                RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/listarreservas.jsp");
                dispatcher.forward(request, response);
            }
            else if(accion.equalsIgnoreCase("verReserva"))
            {
                ManejadorRecurso manejadorRecurso = new ManejadorRecurso();
                manejadorRecurso.setConnection(connection);
                ManejadorTipoRecurso manejadorTipoRecurso = new ManejadorTipoRecurso();
                manejadorTipoRecurso.setConnection(connection);
                try {
                    manejadorRecurso.setCondition("");
                    manejadorTipoRecurso.setConditionTipoRecurso("");
                } catch (SQLException e) {
                    System.out.println("Error accediendo a la base de datos:" + e);
                }
                request.setAttribute("recurso", manejadorRecurso);
                request.setAttribute("tiporecurso", manejadorTipoRecurso);
                int index = Integer.parseInt(request.getParameter("index"));
                ManejadorReserva manejadorReserva=(ManejadorReserva)request.getSession().getAttribute("reserva");
                manejadorReserva.setIndex(index);
                RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/verreserva.jsp");
                dispatcher.forward(request, response);
            }
            else if(accion.equalsIgnoreCase("anularreserva"))
            {
                ManejadorReserva manejadorReserva=(ManejadorReserva)request.getSession().getAttribute("reserva");
                manejadorReserva.anular();
                request.setAttribute("msg","La reserva ha sido anulada con exito.");
                RequestDispatcher dispatcher=request.getRequestDispatcher("/admin.jsp");
                dispatcher.forward(request, response);
            }
            else if(accion.equalsIgnoreCase("modificarReserva"))
            {
                ManejadorReserva manejadorReserva = (ManejadorReserva)request.getSession().getAttribute("reserva");
                int idTipoRecurso = Integer.parseInt(request.getParameter("tipoRecurso"));
                String ubicacion = request.getParameter("ubicacion");
                String personaRetiro = "";
                if (!ubicacion.equalsIgnoreCase("")) {
                    personaRetiro = request.getParameter("personaRetiro");
                }
                String diaInicio = request.getParameter("diaInicio");
                String mesInicio = request.getParameter("mesInicio");
                String anioInicio = request.getParameter("anioInicio");
                String horaInicio = request.getParameter("horaInicio");
                String minutoInicio = request.getParameter("minutoInicio");
                String diaFin = request.getParameter("diaFin");
                String mesFin = request.getParameter("mesFin");
                String anioFin = request.getParameter("anioFin");
                String horaFin = request.getParameter("horaFin");
                String minutoFin = request.getParameter("minutoFin");
                String observacion = request.getParameter("observacion");
                Reserva reserva=manejadorReserva.getReserva();
                TipoRecurso tipoRecurso = new TipoRecurso();
                tipoRecurso.setId(idTipoRecurso);
                reserva.setUbicacion(ubicacion);
                reserva.setPersonaRetiro(personaRetiro);
                reserva.setFechainicio(diaInicio + "/" + mesInicio + "/" + anioInicio);
                reserva.setHorainicio(horaInicio + ":" + minutoInicio);
                reserva.setFechafinal(diaFin + "/" + mesFin + "/" + anioFin);
                reserva.setHorafinal(horaFin + ":" + minutoFin);
                int recursoEspecifico = Integer.parseInt(request.getParameter("idrecurso"));
                reserva.setObservacion(observacion);
                ManejadorRecurso manejadorRecurso=new ManejadorRecurso();
                manejadorRecurso.setConnection(connection);
                manejadorRecurso.setCondition("idrecurso="+recursoEspecifico);
                Recurso recurso = manejadorRecurso.getRecurso();
                reserva.setRecurso(recurso);
                reserva.setIdaprobador(Integer.parseInt(usuarioActual.getIdUsuario()));
                boolean success=false;
                try {
                    success=manejadorReserva.update();
                } catch (SQLException e) {
                    System.out.println("Error accediendo a la base de datos:" + e);
                }
                if(success)
                {
                    request.setAttribute("msg", "La reserva ha sido modificada con exito.");
                }
                else
                {
                    request.setAttribute("msg", "La reserva no ha podido ser modificada debido a conflictos con otras reservas con el mismo recurso.");
                }
                RequestDispatcher dispatcher = request.getRequestDispatcher("/admin");
                dispatcher.forward(request, response);
            }
        } catch (Exception ex) {
            System.out.println("Error: " + ex.getMessage());
        }
    }

//    protected void doGet(HttpServletRequest request, HttpServletResponse response)
//            throws ServletException, IOException {
//        try {
//            Class.forName("org.postgresql.Driver");
//        } catch (ClassNotFoundException cnfe) {
//            System.out.println("Error loading driver: " + cnfe);
//        }
//        Connection connection = null;
//        try {
//            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/srr", "srr", "srradmin");
//        } catch (SQLException e) {
//            System.out.println("Error accediendo a la base de datos:" + e);
//        }
//        /*Connection connection = (Connection) request.getSession().getAttribute("ConexionBd");
//        IteradorUsuario usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");*/
//
//        String accion = request.getParameter("accion");
//        if (accion == null) {
//            ManejadorSolicitudReserva manejadorSolicitudReserva = new ManejadorSolicitudReserva();
//            manejadorSolicitudReserva.setConnection(connection);
//            try {
//                manejadorSolicitudReserva.setCondition("");
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//            request.getSession().setAttribute("solicitudreserva", manejadorSolicitudReserva);
//            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/listasolicitudreserva.jsp");
//            dispatcher.forward(request, response);
//        }
//    }

    public String generate_report(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "/WEB-INF/solicitudreserva.jsp";

//        Listado jasper = new Listado(con);
//        jasper.runReporte("SolicitudesPorRecurso");

        return url;
    }
}
